package com.beantools.filters;

import java.util.Collection;
import java.util.Map;
import java.util.Set;

/**
 * 这是一个过滤器的泛型接口，用来过滤对象。这有两个泛型对象，{@code R }表示
 * 过滤后的封装对象，{@code T }表示待过滤的对象
 * <p>
 * 获取调用者想要的对象集。比如，其有一个MethodFilters<T>的实现类，该实现类
 * 主要过滤set、get、is方法。程序拿到相应的方法，将其转化为属性，比如：
 * <pre>
 *    class student's method name, setPropertyName transformer property name
 * </pre>
 *
 * @author baoya
 * @version 1.1.0
 * @see AbstractFilters <T>
 * @since 1.0
 */
public interface Filters<R, T> {

    /**
     * 过滤的方法，其中有一个object对象，初始化对象的数据。
     *
     * @param ts 泛型对象
     * @return
     */
    void initFilter(Object ts);

    /**
     * 过滤的方法，其有一个泛型数组。返回的是set集合。
     * 就像一个沙漏一样，筛选掉不需要的对象，得到真正
     * 用于程序的对象。对象可能是泛型对象，也可能不是。
     *
     * @param ts   泛型数组
     * @param flag 按照什么方式过滤对象
     * @return set集合，如果ts为空，则返回空对象；如果没有
     * 得到过滤的数据，则返回长度为0的set集合；否则，返回set集合
     */
    Set<R> filter(T[] ts, String flag);

    /**
     * 过滤的方法，其有一个泛型集合。返回的是set集合。
     * 就像一个沙漏一样，筛选掉不需要的对象，得到真正
     * 用于程序的对象。对象可能是泛型对象，也可能不是。
     *
     * @param collection 泛型容器
     * @param flag       按照什么方式过滤对象
     * @return set集合，如果ts为空，则返回空对象；如果没有
     * 得到过滤的数据，则返回长度为0的set集合；否则，返回set集合
     */
    Set<R> filter(Collection<T> collection, String flag);

    /**
     * 过滤的方法，其有一个泛型Map。返回的是set集合。
     * 就像一个沙漏一样，筛选掉不需要的对象，得到真正
     * 用于程序的对象。对象可能是泛型对象，也可能不是。
     *
     * @param rMap map集合,R表示待过滤数组
     * @param flag 按照什么方式过滤对象
     * @return set集合，如果ts为空，则返回空对象；如果没有
     * 得到过滤的数据，则返回长度为0的set集合；否则，返回set集合
     */
    Set<R> filter(Map<Object, T> rMap, String flag);

}
